Port HPET device model to vpt timer subsystem
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 22 Oct 2008 11:04:32 +0000 (12:04 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 22 Oct 2008 11:04:32 +0000 (12:04 +0100)
commitbfd5a3fec25a6dd88425dff7c908127ef4b1dada
treeab0ea83f81ac7dbd523c8af817cda23b8035cf2b
parentc916f30553fc9df0959932324b056d316e603b3f
Port HPET device model to vpt timer subsystem

The current hpet implementation runs a one-shot xen timer for each
hpet timer whenever the main counter is enabled regardless of whether
or not the individual hpet timers are enabled.  When the timer fires,
if it is enabled the interrupt is routed to the guest.  If the hpet
timer is periodic, a new one-shot timer is set, for NOW()+period.
There are a number of problems with this the most significant is guest
time drift.  Windows does not read the hardware clock to verify time,
it depends on timer interrupts firing at the expected interval.  The
existing implementation queues a new one-shot timer each time it fires
and does not allow for a difference between NOW() and the time the
timer was expected to fire, causing drift.  Also there is
no allowance for lost ticks. This modification changes HPET to use the
Virtual Platform Timer (VPT) and, for periodic timers, to use periodic
timers.  The VPT ensures an interrupt is delivered to the guest for
each period that elapses, plus, its use of xen periodic timers ensures
no drift.

Signed-off-by: Peter Johnston <peter.johnston@citrix.com>
xen/arch/x86/hvm/hpet.c
xen/arch/x86/hvm/hvm.c
xen/arch/x86/hvm/i8254.c
xen/arch/x86/hvm/rtc.c
xen/arch/x86/hvm/vlapic.c
xen/arch/x86/hvm/vpt.c
xen/include/asm-x86/hvm/vpt.h